// 记忆函数
const _ = require('lodash')


function getArea(r) {
    console.log(r)
    return Math.PI * r * r
}
// let getAreaWitdhMemory = _.memoize(getArea)
// console.log(getAreaWitdhMemory(4))
// console.log(getAreaWitdhMemory(4))
// console.log(getAreaWitdhMemory(4))

// 自己模拟memoize方法的实现
// 声明一个缓存，没有结果的话，调用函数返回值存起来，返回。
function memoize(f) {
    let cache = {}
    return function () {
        // 把arguments转化为字符串的键，
        let key = JSON.stringify(arguments)
        // 通过这个键来获取，当前这个是否有缓存结果，如果有缓存结果，直接把缓存结果存起来，没有就调用这个函数
        cache[key] = cache[key] || f.apply(f, arguments)
        return cache[key]
    }
}

let getAreaWitdhMemory = memoize(getArea)
console.log(getAreaWitdhMemory(4))
console.log(getAreaWitdhMemory(4))
console.log(getAreaWitdhMemory(4))


// 优点
// 1、可测试
// 2、方便并行处理